//
// server.hpp
// ~~~~~~~~~~
//
// Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#ifndef HTTP_SERVER_H
#define HTTP_SERVER_H

#include <boost/asio.hpp>
#include <string>

#include "Connection.h"
#include "ConnectionManager.h"
#include "RequestHandler.h"

namespace http
{
	namespace server
	{
		/// The top-level class of the HTTP server.
		class Server
		{
		public:
			Server(const Server&) = delete; // disable Copy constructor
			Server& operator=(const Server&) = delete; // disable assignment 

			/// Construct the server to listen on the specified TCP address and port, and
			/// serve up files from the given directory.
			explicit Server(const std::string& address, const std::string& port,
				const std::string& doc_root);

			/// Run the server's io_service loop.
			void run();
		private:
			/// Perform an asynchronous accept operation.
			void do_accept();

			/// Wait for a request to stop the server.
			void do_await_stop();

			/// The io_service used to perform asynchronous operations.
			boost::asio::io_service io_service_;

			/// The signal_set is used to register for process termination notifications.
			boost::asio::signal_set signals_;

			/// Acceptor used to listen for incoming connections.
			boost::asio::ip::tcp::acceptor acceptor_;

			/// The connection manager which owns all live connections.
			ConnectionManager connection_manager_;

			/// The next socket to be accepted.
			boost::asio::ip::tcp::socket socket_;

			/// The handler for all incoming requests.
			RequestHandler request_handler_;
		};
	} // namespace server
} // namespace http
#endif // HTTP_SERVER_H